package com.sztz.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 用hutool工具类处理excel
 * @author yzy
 * @date 2022/5/1 16:29
 */
@Slf4j
public class HuToolExcelUtils {
    /**
     * 校验Excel文件行数是否超过允许的最大行数
     *@param inputStream 文件流
     *@return Map key:sheet页数 value:sheet页的总行数
     *@author yzy
     *@date 2022/5/1 22:16
     */
    private static Map<Integer,Long> getExcelSheetRowNum(InputStream inputStream){
        Map<Integer,Long> map = MapUtil.newHashMap();
        //使用流的方式读取Excel，并将每一页的最大行数记录下来
        ExcelUtil.readBySax(inputStream,-1,(sheetIndex,rowIndex,rowList) ->{
            log.info("{},{},{}",sheetIndex,rowIndex, JSONUtil.toJsonStr(rowList));
            map.put(sheetIndex, rowIndex);
        });
        return map;
    }
    /**
     * 校验Excel文件行数是否超过允许的最大行数
     *@param filePath 文件路径
     *@return Map key:sheet页数 value:sheet页的总行数
     *@author yzy
     *@date 2022/5/3 11:16
     */
    public static Map<Integer,Long> getExcelSheetRowNum(String filePath){
        try(BufferedInputStream inputStream = FileUtil.getInputStream(filePath)){
            return getExcelSheetRowNum(inputStream);
        }catch (Exception e){
            log.info(ExceptionUtil.stacktraceToString(e));
            return MapUtil.newHashMap();
        }
    }
    /**
     * 校验Excel文件行数是否超过允许的最大行数
     *@param file 文件
     *@return Map key:sheet页数 value:sheet页的总行数
     *@author yzy
     *@date 2022/5/3 11:16
     */
    public static Map<Integer,Long> getExcelSheetRowNum(File file){
        try(BufferedInputStream inputStream = FileUtil.getInputStream(file)){
            return getExcelSheetRowNum(inputStream);
        }catch (Exception e){
            log.info(ExceptionUtil.stacktraceToString(e));
            return MapUtil.newHashMap();
        }
    }
    /**
     *校验文件行数是否超过系统允许的最大行数
     *@param filePath 文件路径
     *@param maxRow 允许的最大行数
     *@return Boolean
     *@author yzy
     *@date 2022/5/4 21:42
     */
    public static Boolean checkExcelRowNum(String filePath,int maxRow){
        Map<Integer, Long> excelSheetRowNum = getExcelSheetRowNum(filePath);
        List<String> collect = excelSheetRowNum.entrySet().stream().filter(entry -> maxRow < entry.getValue()).map(entry ->
            StrUtil.format("Excel第{}个sheet总行数为{},已超过{}行;",entry.getKey(),entry.getValue(),maxRow)
        ).collect(Collectors.toList());
        collect.forEach(log::info);
        return CollUtil.isEmpty(collect);
    }
}
